package websocket.util;

import org.apache.poi.hssf.record.DVALRecord;

/**
 * @author nieruijie
 * @Date 2022年9月16日10:30:45
 * 生成双轴转台十六进制数据（启动包括：通讯/运行/暂停等）
 */
public class ZhuanTaiHexDataUtils {

    // 通讯连接指令
    private static final String tongXun = "AA A5 55 0F 00 00 00 00 00 00 00 00 00 B3";
    // 外环使能
    private static final String waiHuanShiNeng = "AA A5 55 2E 00 00 00 00 00 00 00 00 00 D2";
    // 内环使能
    private static final String neiHuanShiNeng = "AA A5 55 1E 00 00 00 00 00 00 00 00 00 C2";
    // 外环使能(取消)
    private static final String waiHuanShiNengCancel = "AA A5 55 2E 00 00 00 00 80 00 00 00 00 52";
    // 内环使能(取消)
    private static final String neiHuanShiNengCancel = "AA A5 55 1E 00 00 00 00 80 00 00 00 00 42";
    // 制动抱闸
    private static final String zhiDongBaoZha = "AA A5 55 0A 00 00 00 00 00 00 00 00 00";
    // 制动解除
    private static final String zhiDongJieChu = "AA A5 55 0C 00 00 00 00 00 00 00 00 00";
    // 使能(取消)
    private static final String shiNengCancel = "80";
    // 使能
    private static final String shiNengOk = "00";
    // 稳定
    private static final String wenDing = "80";
    // 帧头（1~3） AA A5 55
    private static String zhenTou = "AA A5 55";
    private static String zhenTou1 = "AA";
    private static String zhenTou2 = "A5";
    private static String zhenTou3 = "55";
    // 指令（4）：横滚、俯仰、全局
    private static String lx = "";
    // 角度（5~8）
    private static String jiaoDu = "";
    // 使能（9）
    private static String shiNeng = "";
    // 速率（10~13）
    private static String suLv = "";
    // 帧尾（14 从帧头开始数据之和）
    private static String zhenWei = "";
    // 空格
    private static final String kong = " ";

    /**
     * 通讯连接双轴转台指令
     * 转为十六进制byte数组
     *
     * @return 指令
     */
    public static byte[] tongXun() {
        return DigitalTrans.hex2byte(DigitalTrans.convertHexToStringAndTrim(tongXun));
    }

    /**
     * 外环使能（意思为锁定外环，抱死状态）
     *
     * @param lx 1:使能、2：取消使能
     * @return
     */
    public static byte[] waiHuanShiNeng(int lx) {
        if (lx == 1) {
            // 外环使能（意思为锁定外环，抱死状态）
            return DigitalTrans.hex2byte(DigitalTrans.convertHexToStringAndTrim(waiHuanShiNeng));
        }
        // 外环使能（取消）
        return DigitalTrans.hex2byte(DigitalTrans.convertHexToStringAndTrim(waiHuanShiNengCancel));
    }

    /**
     * 内环使能（意思为锁定内环，抱死状态）
     *
     * @param lx 1:使能、2：取消使能
     * @return
     */
    public static byte[] neiHuanShiNeng(int lx) {
        if (lx == 1) {
            // 内环使能（意思为锁定内环，抱死状态）
            return DigitalTrans.hex2byte(DigitalTrans.convertHexToStringAndTrim(neiHuanShiNeng));
        }
        // 内环使能（取消）
        return DigitalTrans.hex2byte(DigitalTrans.convertHexToStringAndTrim(neiHuanShiNengCancel));
    }

    /**
     * 运行
     *
     * @param lx     横滚、俯仰、全局
     * @param jiaoDu 角度
     * @param suLv   速率
     * @param nine   运行类型（第九字节）：内环1、外环2、全局(自动调平)3、抱闸4、解锁5
     * @return /
     */
    public static byte[] runWaiHuan(String lx, int jiaoDu, int suLv, int nine) {
        // 判断第九字节类型
        String nineZiJie = shiNengOk;
        if (nine == 3) {
            // 全局(自动调平)
            nineZiJie = wenDing;
        } else if (nine == 4) {
            // 抱闸
            return runBaoZha();
        } else if (nine == 5) {
            // 解锁
            return runJieSuo();
        }
        // 转换16进制数
        String jiaoDu16 = DigitalTrans.toHex3buWei(jiaoDu);
        String[] jiaoDu16Arr = jiaoDu16.split(" ");
        String suLv16 = DigitalTrans.toHex3buWei(suLv);
        String[] suLv16Arr = suLv16.split(" ");

        // 计算和校验（帧尾）
        int heJiaoYan = 0;
        heJiaoYan += Integer.valueOf(DigitalTrans.covert16Zhuan10(zhenTou1));
        heJiaoYan += Integer.valueOf(DigitalTrans.covert16Zhuan10(zhenTou2));
        heJiaoYan += Integer.valueOf(DigitalTrans.covert16Zhuan10(zhenTou3));
        heJiaoYan += Integer.valueOf(DigitalTrans.covert16Zhuan10(lx));
        for (int i = 0; i < jiaoDu16Arr.length; i++) {
            heJiaoYan += Integer.valueOf(DigitalTrans.covert16Zhuan10(jiaoDu16Arr[i]));
        }
        heJiaoYan += Integer.valueOf(DigitalTrans.covert16Zhuan10(nineZiJie));
        for (int i = 0; i < suLv16Arr.length; i++) {
            heJiaoYan += Integer.valueOf(DigitalTrans.covert16Zhuan10(suLv16Arr[i]));
        }
        // 帧尾转十六进制
        String zhenWei = DigitalTrans.toHex2Trim(heJiaoYan);
        // 最终的十六进制数
        String waihuanRun = zhenTou + kong + lx + kong + jiaoDu16 + kong + nineZiJie + kong + suLv16 + kong + zhenWei;
        System.err.println("waihuanRun:" + waihuanRun);
        return DigitalTrans.hex2byte(DigitalTrans.convertHexToStringAndTrim(waihuanRun));
    }

    /**
     * 运行-解锁
     *
     * @return
     */
    private static byte[] runJieSuo() {
        // 转数组
        String[] zhiLing = zhiDongJieChu.split(" ");
        // 计算和校验（帧尾）
        int heJiaoYan = 0;
        for (int i = 0; i < zhiLing.length; i++) {
            heJiaoYan += Integer.valueOf(DigitalTrans.covert16Zhuan10(zhiLing[i]));
        }
        // 帧尾转十六进制
        String zhenWei = DigitalTrans.toHex2Trim(heJiaoYan);
        // 最终的十六进制数
        String runZhiLing = zhiDongJieChu + kong + zhenWei;
        System.err.println("解锁：" + runZhiLing);
        return DigitalTrans.hex2byte(DigitalTrans.convertHexToStringAndTrim(runZhiLing));
    }

    /**
     * 运行-抱闸
     *
     * @return
     */
    private static byte[] runBaoZha() {
        // 转数组
        String[] zhiLing = zhiDongBaoZha.split(" ");
        // 计算和校验（帧尾）
        int heJiaoYan = 0;
        for (int i = 0; i < zhiLing.length; i++) {
            heJiaoYan += Integer.valueOf(DigitalTrans.covert16Zhuan10(zhiLing[i]));
        }
        // 帧尾转十六进制
        String zhenWei = DigitalTrans.toHex2Trim(heJiaoYan);
        // 最终的十六进制数
        String runZhiLing = zhiDongBaoZha + kong + zhenWei;
        System.err.println("抱闸：" + runZhiLing);
        return DigitalTrans.hex2byte(DigitalTrans.convertHexToStringAndTrim(runZhiLing));
    }

    public static void main(String[] args) {
        //   runWaiHuan("1E", -130300, 10000);
        System.err.println(DigitalTrans.toHex(10));
        System.err.println(DigitalTrans.toHex3buWei(10));
//        String jiaoDuStr = DigitalTrans.toHex2Trim(10).trim();
//        System.err.println(jiaoDuStr);
    }


}
